<?php

if (!defined('BASEPATH'))
    exit('No direct script access allowed');

/**
 * Template kütüphanesi
 *
 * @version 1.0
 * @package Codeigniter
 * @subpackage Library
 * @author Ali OYGUR <alioygur@gmail.com>
 * */
class Template {

    /**
     * ci supper global
     * @since 1.0
     * @var object
     */
    private $ci;

    /**
     * Tüm view değişkenleri bu dizi değişkende tutulur.
     * 
     * @since 1.0
     * @var array
     */
    public $template_data = array();

    /**
     * örneğin fronted veya backend
     * setSide() methodu ile üzerine yazılabilir.
     * 
     * @since 1.0
     * @var string
     */
    private $side = null;

    /**
     * Layout dosyalarının bulunduğu klasörün adı
     * 
     * @since 1.0
     * @var string
     */
    private $layout_path = 'layout';

    /**
     * layout dosyasının adı.
     * default: default
     * setLayout() methodu ile üzerine yazılabilir.
     * 
     * @since 1.0
     * @var string 
     */
    private $layout = 'default';
    
    /**
     * Kurucu metod
     * 
     * @since 1.0
     * @param null | array $config 
     */
    public function __construct($config = null) {

        $this->ci = & get_instance();

        $this->init();
    }

    /**
     * Yapılandırma
     * 
     * @since 1.0
     */
    private function init() {
        
        empty($this->side) OR $this->side = trim($this->side, '/') . '/';
        
        $this->layout_path = trim($this->layout_path, '/') . '/';
		
		// SET DEFAULT TEMPLATE DATA
		$data = array(
			// Open Graph Tags
			'og_title' => setting('og', 'title'),
			'og_description' => setting('og', 'description'),
			'og_site_name' => setting('og', 'name'),
			'og_type' => setting('og', 'type'),
			'og_url' => current_url(),
			'og_image' => setting('og', 'image'),
			'og_app_id' => setting('app', 'id'),
			
			// Seo
			'seo_title' => setting('seo', 'title'),
			'seo_description' => setting('seo', 'description'),
			'seo_keywords' => setting('seo', 'keywords'),
			
			// Other
			'metadata' => ''
		);
		
		$this->template_data = $data;
    }

    /**
     * View dosyaları içerisinde kullanılmak üzere herhangi bir değişkene değer set eder.
     * 
     * @since 1.0
     * @param string $name değişkenin adı
     * @param string $value değişkenin değeri
     * @return object
     */
    public function set($name = '', $value = '') {

        if (is_array($name)) {
            $this->template_data = array_merge($name, $this->template_data);
            return null;
        }

        $this->template_data[$name] = $value;
        
        return $this;
    }

    /**
     * Metadata değişkenini set eder.
     * Bu fonksiyon aracilığı ile meta etiketi eklenir.
     * 
     * @since 1.0
     * @example $this->template->set_metadata('<script type="text/javascript" charset="utf-8" src="assets/js/jquery.js" />');
     * @staticvar strıng $_metadata
     * @param string $metadata 
     * @return object
     */
    public function set_metadata($metadata = '') {

        static $_metadata = '';

        $metadata = trim($metadata);

        $_metadata .= $metadata . PHP_EOL;

        $this->set('metadata', $_metadata);
        
        return $this;
    }

    /**
     * Bir view parçası yükler
     * 
     * @since 1.0
     * @param string $view view dosyası
     * @param array $view_data yüklenecek olan view dosyası içerisinde kullanılmak üzere varsa data
     * @param bool $return view dosyasının çıktı şekli TRUE direk ekrana basılmaz FALSE direk ekrana basar
     */
	public function load_partial($view = '', $view_data = array(), $return = FALSE)
	{
		if($return)
        	return $this->ci->load->view($this->side . $view, $view_data, $return);
		else
			$this->ci->load->view($this->side . $view, $view_data, $return);
    }

    /**
     * Bir layout ile birlikte herhangi bir view dosyasını yükler
     *
     * @since 1.0
     * @param string $view layout dosyası içeriğine yüklenecek view dosyası
     * @param array $view_data yüklenecek olan view dosyası içerisinde kullanılmak üzere varsa data
     * @param bool $return view dosyasının çıktı şekli TRUE direk ekrana basılmaz FALSE direk ekrana basar
     * @return string
     */
    public function load($view = '', $view_data = array(), $return = FALSE) {

        $template = $this->side . $this->layout_path . $this->layout;
        $view = $this->side . $view;

        $this->set('content', $this->ci->load->view($view, $view_data, TRUE));

        $this->ci->load->view($template, $this->template_data, $return);
    }

    /**
     * Tarafı set eder.
     * 
     * @since 1.0
     * @param string $side taraf
     * @return object
     */
    public function set_side($side = '') {
        $this->side = $this->side   = trim($side, '/') . '/';;
        return $this;
    }

    /**
     * Layout dosyasını set eder.
     * 
     * @since 1.0
     * @param string $layout 
     * @return object
     */
    public function set_layout($layout = '') {
        $this->layout = $layout;
        return $this;
    }
}

/* End of file Template.php */
